#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 
'''
Pedro Santos nº12065
Rui Pereira nº12061


PC
	CPU intel core i7 2630 QM 2.4Ghz
	executado numa virtual box Memoria RAM 5gB
	Acelaraco VT-x/AMD-V activada


*** Testes realizados ***

Interacões		    PC
100					0.0
1000				0.01
10000				0.1
100000				0.89
1000000				9.04				


'''

import time
import os
import random
import sys


'''
limpa o terminal/consola
'''

os.system('clear')

begin_time = time.clock()


def preencher_tabela():
    '''
    Cria a Tabela T com 1000 elementos variando a posição j (x)
    Cria e inicia na primeira posição (0) o valor de j
    Cria uma tabela de contagem tab_contagem com 10 elementos que são as possibilidades de digitos [0,9]
    '''
    T = [0 for x in range(0,1000)]
    j = 0
    tab_contagem = [0 for x in range(0,10)]

    '''
    ciclo while para percorrer a tabela T de indice j
    atribui um numero aleatorio entre 0..9 à variavel x
    Vai validar a quantidade de repetições de cada digito através de tab_contagem, cada um não pode exceder 100 repetições
    '''

    while j < 1000:
        x = random.randint(0,9)
        '''
        atribuição de valor aleatorio a x 0..9
        '''
        if tab_contagem[x] > 99:
                        continue 
                        '''
                        comprova na posição de 0..9 da tab_contagem se o digito em questão já atingio 100 repetições
                        '''
            
                        '''
                        Se atingiu o limite, salta do ciclo sem adicionar o valor randomizado à tabela T[]
                        '''
        tab_contagem[x] += 1 
        '''
        se não atinge a as 100 repetições, adiciona mais uma repetição na correspondente tabela de contagem
        '''
        T[j] = x 
        '''
        Adiciona o digito randomizado à correspondente posição j na tabela T[]
        '''
        j += 1 
        '''
        Avança a posição j na tabela T[]
        '''
        pass
        '''
        Retorna a Tabela T
        '''
    return T

'''
Percorre o preenchimento da Tabela para a não repetição de digitos
'''   

def contagem(T):
    tab_contagem = [0 for x in range(0,10)]
    for x in T:
        tab_contagem[x] += 1
        pass
    for x in tab_contagem:
        print x
        pass
    pass

T = preencher_tabela()   

'''
Função que troca posicao T[l] com o valor na posicao T[0]
''' 
def switchTab(l):
        aux = T[l]
        T[l] = T[0]
        T[0] = aux
        pass


#*****************************************************************
'''
Ciclo que atribui a Z1,Z2,Z3 e Z4 os valores calculados com base nos parametros existentes no enunciado
'''

def Acha_z(p):
    Z = [0 for x in range(0,5)]
    for j in range (0,3):
        if (p<1000-j):
            l=p+j
            pass
        else:
            l=0
            pass
        Z[j+1]=T[l]
        switchTab(l)
        pass
    return Z
'''
Cilco para executar as repetições em numero de k
'''

def repete_k(k):
    p = random.randint(0,999)
    N=[0 for k in range(0,k)]
    for i in range(0,k+1):
        Z = Acha_z(p)
        N[i] = Z[1]<<12|Z[2]<<8|Z[3]<<4|Z[4]
        print ("N",i, "->",N[i])
        p=Z[1]*100+Z[2]*10+Z[3]*1
        pass
    pass

if len(sys.argv) < 2:
    print "Deve inserir a quantidade de números aleatorios a gerar"
    sys.exit(1)
else:
    #print "argv", argv[1]
    k=int(sys.argv[1])
    repete_k(k)
end_time = time.clock()
print end_time-begin_time, "segundos"
